/******************************************************************************* * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ant.internal.ui.views.actions; import java.util.Iterator; import org.eclipse.ant.internal.ui.AntUIImages; import org.eclipse.ant.internal.ui.IAntUIConstants; import org.eclipse.ant.internal.ui.IAntUIHelpContextIds; import org.eclipse.ant.internal.ui.launchConfigurations.AntLaunchShortcut; import org.eclipse.ant.internal.ui.model.AntElementNode; import org.eclipse.ant.internal.ui.model.AntProjectNode; import org.eclipse.ant.internal.ui.model.AntTargetNode; import org.eclipse.ant.internal.ui.model.AntTaskNode; import org.eclipse.ant.internal.ui.views.AntView; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.UIJob; import org.eclipse.ui.texteditor.IUpdate; /** * Action which runs the selected target or the default target of the selected project in the AntView. */ public class RunTargetAction extends Action implements IUpdate { private AntView fView; /** * Creates a new <code>RunTargetAction</code> which will execute targets in the given view. * * @param view * the Ant view whose selection this action will use when determining which target to run. */ public RunTargetAction(AntView view) { setText(AntViewActionMessages.RunTargetAction_Run_1); setImageDescriptor(AntUIImages.getImageDescriptor(IAntUIConstants.IMG_RUN)); PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IAntUIHelpContextIds.RUN_TARGET_ACTION); setToolTipText(AntViewActionMessages.RunTargetAction_3); fView = view; } /** * Executes the appropriate target based on the selection in the Ant view. */ @Override public void run() { run(getSelectedElement()); } /** * @param selectedElement * The element to use as the context for launching */ public void run(final AntElementNode selectedElement) { UIJob job = new UIJob(AntViewActionMessages.RunTargetAction_2) { @Override public IStatus runInUIThread(IProgressMonitor monitor) { launch(selectedElement); return Status.OK_STATUS; } }; job.schedule(); } /** * Launches the given Ant element node * * @param node * the node to use to launch * @see AntLaunchShortcut#launch(AntElementNode, String) */ public void launch(AntElementNode node) { AntLaunchShortcut shortcut = new AntLaunchShortcut(); shortcut.setShowDialog(false); shortcut.launch(node, ILaunchManager.RUN_MODE); } /** * Updates the enablement of this action based on the user's selection */ @Override public void update() { AntElementNode selection = getSelectedElement(); boolean enabled = false; if (selection instanceof AntTargetNode) { if (!((AntTargetNode) selection).isErrorNode()) { setToolTipText(AntViewActionMessages.RunTargetAction_4); enabled = true; } } else if (selection instanceof AntProjectNode) { if (!((AntProjectNode) selection).isErrorNode()) { enabled = true; setToolTipText(AntViewActionMessages.RunTargetAction_3); } } else if (selection instanceof AntTaskNode) { if (!((AntTaskNode) selection).isErrorNode()) { enabled = true; setToolTipText(AntViewActionMessages.RunTargetAction_0); } } setEnabled(enabled); } /** * Returns the selected node or <code>null</code> if more than one element is selected. * * @return AntElementNode the selected node */ private AntElementNode getSelectedElement() { IStructuredSelection selection = (IStructuredSelection) fView.getViewer().getSelection(); if (selection.isEmpty()) { return null; } Iterator<?> iter = selection.iterator(); Object data = iter.next(); if (iter.hasNext()) { return null; } return (AntElementNode) data; } }